// 1. 下载 axios
// ohpm install @ohos/axios
// 2. 引入 axios
import axios, { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from '@ohos/axios';
import { promptAction } from '@kit.ArkUI';

// 3. 配置 axios （封装请求函数）
// 返回值：可以发送请求的函数对象
const request = axios.create({
  // baseURL: 'http://localhost:6060', // 只有预览器能够访问，模拟器或真机不行
  // baseURL: 'http://172.19.0.11:6060', // 通过 ipconfig 查询到本机 ip 地址，这个地址才能实现预览器、模拟器和真机都能访问
  // baseURL: 'http://192.168.0.105:6060',
  // baseURL: 'http://192.168.144.1',

  baseURL: 'http://192.168.0.103:6060',
  timeout: 20000, // 请求超时时间
  headers: {
    toke: "9877777"
  }

})

// 拦截器函数
// 将来使用request发送请求，发送请求流程：
// 先触发请求拦截器设置的回调函数，再去发送请求，最后响应拦截器设置的回调函数
// 请求拦截器
request.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    let com = JSON.stringify(config)
    console.log("consss", JSON.stringify(config));
    // config.headers.name =
    // config: 发送请求的配置项（请求地址url、请求方式method、请求头headers、请求参数等）
    // 作用：携带公共请求参数 - token
    const token = AppStorage.get<string>('token')
    if (token) {
      config.headers.token = token
    }
    return config
  },
  // () => {}
)
// 响应拦截器
request.interceptors.response.use(
  // 看响应状态码 status -> 如果是 2xx 就是成功，否则就是失败
  // 成功回调
  (response: AxiosResponse) => {
    // 进入成功回调，只是说明响应状态码是2xx，并不代表请求的功能成功了
    // 登录 -> 登录成功 / 登录失败，
    // 此时要看 response.data.code, 200 功能成功，非 200 就是功能失败
    if (response.data.code === 200) {
      // 功能成功：返回成功的数据
      // response.data 就是响应体数据
      // 一旦没有报错，或没有返回失败状态promise，既是成功状态
      return response.data.data
    } else {
      // 功能失败: 返回失败的状态
      console.log(response.data.message)
      return Promise.reject(response.data.message) // 返回失败状态的 promise
    }
  },
  // 失败回调
  (error: AxiosError) => {
    console.log(error.message)
    let messagpo: string = error.message || ''
    promptAction.showToast({
      message: messagpo,
      duration: 2000,
      bottom: 100
    })
    return Promise.reject(error.message)
  }
)


export default class Http {
  get<T>(url: string, params?: Object, headers?: Record<string, any>) {
    // 创建一个配置对象，将 params 和 headers 合并
    const config = {
      params,
      ...(headers && {
        headers
      }) // 如果 headers 不为 undefined，则添加到配置中
    };

    return request.get<null, T>(url, config);
  }

  post<T>(url: string, data?: Object, headers?: Record<string, any>) {
    const config = {
      ...(headers && {
        headers
      })
    };
    return request.post<null, T>(url, data, config);
  }

  put<T>(url: string, data?: Object, headers?: Record<string, any>) {
    const config = {
      ...(headers && {
        headers
      })
    };
    return request.put<null, T>(url, data, config);
  }

  delete<T>(url: string, params?: Object, headers?: Record<string, any>) {
    const config = {
      params,
      ...(headers && {
        headers
      })
    };
    return request.delete<null, T>(url, config);
  }
}


// 4. 暴露出去
// export default request;